--- /dev/null
+#!/bin/bash
+# vi: sw=2 ts=4
+
+set -e
+
+DEFAULT_TOOLBOX=gnome-shell-devel
+CONFIG_FILE=${XDG_CONFIG_HOME:-$HOME/.config}/gnome-shell-toolbox-tools.conf
+
+usage() {
+ cat <<-EOF
+ Usage: $(basename $0) [OPTION…]
+
+ Run gnome-shell from a toolbox
+
+ Options:
+ -t, --toolbox=TOOLBOX Use TOOLBOX instead of the default "$DEFAULT_TOOLBOX"
+
+ --classic Run in Classic mode
+ --greeter Run (simulated) login screen
+
+ -2, --multi-monitor Run with two monitors
+ -0, --headless Run headless
+
+ --rtl Force right-to-left layout
+ --locale=LOCALE Use specified LOCALE
+
+ --debug Run in gdb
+ -v, --verbose Enable debug logging
+
+ --unsafe-mode Do no restrict D-Bus APIs
+ --force-animations Force animations to be enabled
+
+ --version Print version
+ -h, --help Display this help
+
+ EOF
+}
+
+die() {
+ echo "$@" >&2
+ exit 1
+}
+
+find_locale() {
+ locale -a | sed -e "/^$1/!d" -e '/\.utf8$/I!d' | head -n 1
+}
+
+should_run_nested() {
+ [[ "$XDG_SESSION_TYPE" != "tty" ]] && [[ ! "$HEADLESS" ]]
+}
+
+# load defaults
+. $CONFIG_FILE
+TOOLBOX=$DEFAULT_TOOLBOX
+
+SHELL_ENV=(XDG_CURRENT_DESKTOP=GNOME)
+SHELL_ARGS=()
+
+TEMP=$(getopt \
+ --name $(basename $0) \
+ --options '20t:vh' \
+ --longoptions 'toolbox:' \
+ --longoptions 'classic' \
+ --longoptions 'greeter' \
+ --longoptions 'multi-monitor' \
+ --longoptions 'headless' \
+ --longoptions 'rtl' \
+ --longoptions 'locale:' \
+ --longoptions 'debug' \
+ --longoptions 'verbose' \
+ --longoptions 'unsafe-mode' \
+ --longoptions 'force-animations' \
+ --longoptions 'version' \
+ --longoptions 'help' \
+ -- "$@") || die "Run $(basename $0) --help to see available options"
+
+eval set -- "$TEMP"
+unset TEMP
+
+while true; do
+ case $1 in
+ -t|--toolbox)
+ TOOLBOX=$2
+ shift 2
+ ;;
+
+ --classic)
+ SHELL_ENV+=(XDG_CURRENT_DESKTOP=GNOME-Classic:GNOME)
+ SHELL_ARGS+=(--mode=classic)
+ shift
+ ;;
+
+ --greeter)
+ SHELL_ENV+=(GDM_GREETER_TEST=1)
+ SHELL_ARGS+=(--mode=gdm)
+ shift
+ ;;
+
+ -2|--multi-monitor)
+ SHELL_ENV+=(MUTTER_DEBUG_NUM_DUMMY_MONITORS=2)
+ shift
+ ;;
+
+ -0|--headless)
+ HEADLESS=1
+ SHELL_ARGS+=(--headless)
+ shift
+ ;;
+
+ --rtl)
+ SHELL_ENV+=(CLUTTER_TEXT_DIRECTION=rtl)
+ shift
+ ;;
+
+ --locale)
+ SHELL_ENV+=(LANG=$(find_locale $2))
+ shift 2
+ ;;
+
+ --debug)
+ GDB="gdb --args"
+ shift
+ ;;
+
+ -v|--verbose)
+ SHELL_ENV+=(
+ G_MESSAGES_DEBUG="GNOME Shell"
+ SHELL_DEBUG=backtrace-warnings
+ )
+ shift
+ ;;
+
+ --unsafe-mode|--force-animations|--version)
+ SHELL_ARGS+=($1)
+ shift
+ ;;
+
+ -h|--help)
+ usage
+ exit 0
+ ;;
+
+ --)
+ shift
+ break
+ ;;
+ esac
+done
+
+if should_run_nested; then
+ SHELL_ARGS+=( --nested )
+else
+ SHELL_ARGS+=( --wayland )
+fi
+
+display=toolbox-wayland-$RANDOM
+SHELL_ENV+=(WAYLAND_DISPLAY=$display)
+SHELL_ARGS+=(--wayland-display=$display)
+
+toolbox --container $TOOLBOX run \
+ env "${SHELL_ENV[@]}" dbus-run-session $GDB gnome-shell "${SHELL_ARGS[@]}"